package cn.fl.capital.service;

import cmm.mid.core.framework.page.DataResultVO;
import cmm.mid.core.framework.page.KeyValueVO;
import cmm.mid.core.framework.page.Pager;
import cn.cmm.base.framework.exception.BaseException;
import cn.fl.capital.condition.CapFundQueryCondition;
import cn.fl.capital.dto.CapFundDTO;
import cn.fl.capital.vo.CapFundOutLogVO;
import cn.fl.capital.vo.CapFundVO;
import cn.fl.export.condition.CapFundExportCondition;
import cn.fl.project.dto.PrjPrdPaySchDDTO;
import cn.fl.project.vo.BillItemVO;
import cn.fl.project.vo.PrjPrdPaySchDVO;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @Description: 客户资金表 客户端服务层接口
 * 业务层方法名称前缀：
 * 新增：add*
 * 删除：remove*
 * 修改：modify*
 * 批量：batch*
 * 查询对象：select* get*
 * 查询集合：search*
 */
public interface ICapFundService {

    /**
     * 获取唯一对象
     *
     * @param id 主键
     * @return 对象DTO
     */
    CapFundVO selectById(Long id) throws BaseException;

    /**
     * 新增
     *
     * @param entity
     * @return
     */
    Long add(CapFundVO entity) throws BaseException;

    /**
     * 批量新增
     *
     * @param fundList
     * @return
     */
    boolean add(List<CapFundVO> fundList) throws BaseException;

    /**
     * 批量删除
     *
     * @param ids
     * @return
     */
    boolean removeByIds(List<Long> ids) throws BaseException;

    /**
     * 修改
     *
     * @param entity
     * @return
     */
    boolean modify(CapFundVO entity) throws BaseException;

    /**
     * 分页查询所有
     *
     * @param page
     * @return
     */
    Pager searchListPage(Pager page) throws BaseException;

    /**
     * 根据条件查询所有
     *
     * @param condition
     * @return
     */
    List<CapFundVO> searchList(CapFundQueryCondition condition) throws BaseException;

    /**
     * 手动认款，修改资金所属客户信息
     *
     * @param entity
     * @return
     * @throws BaseException
     */
    DataResultVO modifyFundCstInfo(CapFundVO entity) throws BaseException;

    /**
     * 自动认款，批量修改资金所属客户信息
     *
     * @param condition
     * @return
     * @throws BaseException
     */
    List<CapFundVO> batchModifyFundCstInfo(CapFundQueryCondition condition) throws BaseException;

    /**
     * 资金分解 手动分解
     *
     * @param condition  资金condition
     * @param schDVOList 支付表明细VO集合
     * @return
     * @throws BaseException
     */
    DataResultVO addFundDecompose(CapFundQueryCondition condition, List<PrjPrdPaySchDVO> schDVOList) throws BaseException;

    /**
     * 资金分解 手动分解
     *
     * @param condition  资金condition
     * @return
     * @throws BaseException
     */
    DataResultVO addFundManualDecompose(CapFundQueryCondition condition) throws BaseException;

 /**
     * 资金分解 手动分解 分解异常支付表
     */
    DataResultVO addFundManualDecomposeAbnormal(CapFundQueryCondition condition) throws BaseException;


    /**
     * 来款自动核销-批量分解
     *
     * @param condition 分解条件
     * @return
     */
    DataResultVO batchDecomFund(CapFundQueryCondition condition) throws BaseException;

    /******************************
     * 查询待分解支付表集合
     * @param condition
     * @return
     * @throws BaseException
     ******************************/
    List<PrjPrdPaySchDVO> searchPaySchDList(CapFundQueryCondition condition) throws BaseException;

    /** 是否异常核销流程 */
    boolean isOpenAbnormalDecompose();

    /******************************
     * 查询用户待还款账单费用明细列表
     ****************************/
    List<BillItemVO> queryBillItemList(CapFundQueryCondition condition);

    /******************************
     * 查询未启用支付表账单费用明细列表
     ****************************/
    List<BillItemVO> queryNotEnabledBillItemList(CapFundQueryCondition condition);

    /******************************************
     * 放款流程中核销首期款，查询客户支付表首付款明细
     *
     * @param condition
     * @return
     * @throws BaseException
     *****************************************/
    List<PrjPrdPaySchDVO> searchFstPayList(CapFundQueryCondition condition) throws BaseException;

    /**
     * 查询分解资金可否冲红
     *
     * @param fundId
     * @return
     * @throws BaseException
     */
    boolean validateFundRevert(Long fundId) throws BaseException;

    /**
     * 验证资金可否修改
     *
     * @param idList
     * @return
     * @throws BaseException
     */
    DataResultVO validateDecomFund(List<Long> idList) throws BaseException;

    /**
     * 查询认款客户
     *
     * @return
     * @throws BaseException
     */
    Pager searchCstListPage(Pager page) throws BaseException;

    /**
     * 添加支付表费用，查询流程发起时间
     *
     * @param prjPrdPaySchDVO
     * @return
     * @throws BaseException
     */
    Date getAddFeeFlowStartTime(PrjPrdPaySchDVO prjPrdPaySchDVO) throws BaseException;

    /**
     * 查询流程发起时间
     *
     * @param dataId 业务主键
     * @param bizTyp 业务类型 1.放款 2.添加风险保证金 3.结清
     * @return
     * @throws BaseException
     */
    Date getFlowStartTime(Long dataId, String bizTyp) throws BaseException;

    /**
     * 修改支付表
     *
     * @param dataId
     * @throws BaseException
     */
    boolean modifyPaySchById(Long dataId) throws BaseException;

    /**
     * 导出资金列表
     * @param condition
     * @return
     * @throws BaseException
     */
    DataResultVO exportFundList(CapFundExportCondition condition) throws BaseException;

    /**
     * 设置结清时间
     * @param prjPrdDtlId
     * @param stlDt
     * @return
     * @throws BaseException
     */
    DataResultVO modifyStlDt(Long prjPrdDtlId, String stlDt) throws BaseException;

    /**
     * 查询费用项名称
     * @param feeTypCd
     * @return
     * @throws BaseException
     */
    String getFeeTypCdNm(String feeTypCd) throws BaseException;
    
    
    

    /**
     * 资金冻结
     *
     * @param condition
     * @return
     * @throws BaseException
     */
    boolean ModifyListFundCstInfo(List<CapFundVO> idsList) throws BaseException;
    
    
    /**
     * 查询下拉框数据-资金类型
     * @return
     * @throws BaseException
     */
    List<KeyValueVO> searchFundTypeCdList()throws BaseException;
    
    
    
	/**
	 * 通过核销id集合 查具体核销记录
	 * @param funid
	 * @return
	 * @throws BaseException
	 */
    Map<Long,Long> searchfundVHList(List<CapFundOutLogVO> funid, List<CapFundVO> list)throws BaseException;


    /**
     * 手动分解查询APP贷款账单 List
     * @param condition 资金明细QC
     * @return
     * @throws BaseException
     */
    List<PrjPrdPaySchDDTO> selectMcrBillList(CapFundQueryCondition condition) throws BaseException ;
    
    /**
     * 只删除关联id
     * @param idsList id集合
     * @return
     * @throws BaseException
     */
    boolean deleteOnlyRelationPayIdByIds(List<Long> idsList) throws BaseException ;

    /**
     * 将母资金拆分为一笔子资金
     * @param capFundDTO
     * @return
     * @throws BaseException
     */
    boolean addChildFundFromParentFund(CapFundDTO capFundDTO) throws BaseException;

    /**
     * 删除子资金
     * @param childFundId
     * @return
     * @throws BaseException
     */
    boolean removeChildFund(Long childFundId) throws BaseException;

    /**
     * 修改子资金
     * @param capFundVO
     * @return
     * @throws BaseException
     */
    boolean modifyChildFund(CapFundVO capFundVO) throws BaseException;

	/******************************
     * SH&BF查询WS待分解FEE支付表集合
     * @param condition
     * @return
     * @throws BaseException
     ******************************/
    List<PrjPrdPaySchDVO> searchWSFeeList(Long paySchId);

    /**
     * 手动分解查询垫款贷账单明细 List
     * @param condition 资金QC
     * @return
     * @throws BaseException
     */
    List<PrjPrdPaySchDDTO> selectPblBillList(CapFundQueryCondition condition) throws BaseException;

}
